import * as XLSX from 'xlsx';
import { ElMessage } from 'element-plus';
import dayjs from 'dayjs';
import { engineList, STANDARD_COAL_FACTORS } from '@/constants';
import { useAreaStore } from '@/stores/area';

export function useExportMeters() {
    const areaStore = useAreaStore();

    // 获取引擎名称
    const getEngineName = (engineId) => {
        const engine = engineList.find(item => item.value === engineId);
        return engine ? engine.label : '未知';
    };

    // 获取区域名称
    const getAreaName = (areaId) => {
        return areaStore.getAreaNameById(areaId) || '';
    };

    // 获取表计类型名称
    const getMeterTypeName = (type) => {
        switch (type) {
            case 1: return '水表';
            case 2: return '电表';
            case 3: return '气表';
            case 6: return '压力表';
            default: return '水表';
        }
    };

    // 导出选中的表计（批量导入格式）
    const exportSelectedMeters = (selectedMeters, allMeters = []) => {
        if (!selectedMeters || selectedMeters.length === 0) {
            ElMessage.warning('请先选择要导出的表计');
            return;
        }

        const exportData = prepareImportFormatData(selectedMeters, allMeters);
        generateImportFormatExcel(exportData, `表计导入模板_${selectedMeters.length}个_${dayjs().format('YYYY-MM-DD_HH-mm-ss')}`);
    };

    // 导出所有表计（批量导入格式）
    const exportAllMeters = (allMeters) => {
        if (!allMeters || allMeters.length === 0) {
            ElMessage.warning('没有可导出的表计数据');
            return;
        }

        const exportData = prepareImportFormatData(allMeters, allMeters);
        generateImportFormatExcel(exportData, `表计导入模板_${allMeters.length}个_${dayjs().format('YYYY-MM-DD_HH-mm-ss')}`);
    };

    // 导出详细信息（原格式）
    const exportDetailedMeters = (selectedMeters, allMeters = []) => {
        if (!selectedMeters || selectedMeters.length === 0) {
            ElMessage.warning('请先选择要导出的表计');
            return;
        }

        const exportData = prepareDetailedData(selectedMeters, allMeters);
        generateDetailedExcel(exportData, `表计详细信息_${selectedMeters.length}个_${dayjs().format('YYYY-MM-DD_HH-mm-ss')}`);
    };

    // 准备导入格式数据（与导入组件兼容）
    const prepareImportFormatData = (meters, allMeters) => {
        return meters.map((meter) => {
            // 查找父级表计的meter_id
            const parentMeter = allMeters.find(m => m.id === Number(meter.parent_id));
            const parentMeterId = parentMeter ? parentMeter.meter_id : '';

            // 处理信驰表号（引擎类型为16时使用meter_id）
            const xinchiMeterId = meter.engine_id === 16 ? meter.meter_id : '';

            return {
                '表计类型': getMeterTypeName(meter.type),
                '表号': meter.meter_id || '',
                '安装位置': meter.installation_location || '',
                '表计编码': meter.meter_code || '',
                '摄像头表号': xinchiMeterId,
                '规格': meter.specification || '',
                '表计名称': meter.meter_name || '', // G列：表计名称
                '制造商': meter.manufacturer || '', // H列：制造商
                '上级表号': parentMeterId,
                '区域': getAreaName(meter.area_id),
                '楼栋': meter.cell || '', // K列：楼栋
                '用途': meter.sub_category || '', // L列：用途
                '供应点位': meter.supply_region || '', // M列：供应点位
                '倍率': meter.multiple || '1', // N列：倍率
                '启表底数': meter.bottom_value || '0', // O列：启表底数
                '折标煤系数': meter.standard_coal_factor || '1', // P列：折标煤系数
                '参与漏水统计': meter.type === 1 ? (meter.is_drain_considerd ? '是' : '否') : '', // Q列：参与漏水统计
                '纳入离线统计': meter.check_no_record ? '是' : '否', // R列：纳入离线统计
                '重点设备': meter.is_important_device ? '是' : '否', // S列：重点设备
                '重要设备名称': meter.is_important_device ? (meter.important_device_name || '') : '', // T列：设备名称
                '信号强度': meter.CSQ || '', // U列：信号强度
                '安装日期': meter.installation_date ? dayjs(meter.installation_date).format('YYYY-MM-DD') : '', // V列：安装日期
                '备注': meter.remarks || '' // W列：备注
            };
        });
    };

    // 准备详细数据（原有的详细格式）
    const prepareDetailedData = (meters, allMeters) => {
        return meters.map((meter, index) => {
            // 查找父级表计名称
            const parentMeter = allMeters.find(m => m.id === Number(meter.parent_id));
            const parentName = parentMeter ? parentMeter.meter_code : '无';

            return {
                '序号': index + 1,
                '表计名称': meter.meter_name || '',
                '表计编码': meter.meter_code || '',
                '表计ID': meter.meter_id || '',
                '表计类型': getMeterTypeName(meter.type),
                '引擎': getEngineName(meter.engine_id),
                '状态': meter.status === 1 ? '可用' : '不可用',
                '规格': meter.specification || '',
                '制造商': meter.manufacturer || '',
                '能源类别': meter.meter_type || '',
                '折标煤系数': meter.standard_coal_factor || '',
                '倍率': meter.multiple || '1',
                '启表底数': meter.bottom_value || '0',
                '父级表计': parentName,
                '安装位置': meter.installation_location || '',
                '安装日期': meter.installation_date ? dayjs(meter.installation_date).format('YYYY-MM-DD') : '',
                '供应点位': meter.supply_region || '',
                '区域': getAreaName(meter.area_id),
                '楼栋': meter.cell || '',
                '用途': meter.sub_category || '',
                '参与漏水统计': meter.type === 1 ? (meter.is_drain_considerd ? '是' : '否') : 'N/A',
                '纳入离线统计': meter.check_no_record ? '是' : '否',
                '电表类型': meter.type === 2 ? getElecGenerateTypeName(meter.elec_generate) : 'N/A',
                '新能源类型': meter.type === 2 && meter.elec_generate === 1 ? (meter.new_energy || '') : 'N/A',
                '重点设备': meter.is_important_device ? '是' : '否',
                '设备名称': meter.is_important_device ? (meter.important_device_name || '') : '',
                '信号强度': meter.CSQ || '',
                '备注': meter.remarks || ''
            };
        });
    };

    // 生成导入格式Excel（与导入组件兼容）
    const generateImportFormatExcel = (data, filename) => {
        try {
            // 创建工作簿
            const wb = XLSX.utils.book_new();

            // 将数据转换为工作表
            const ws = XLSX.utils.json_to_sheet(data);

            // 设置列宽（按照导入格式要求）
            const colWidths = [
                { wch: 10 },  // A列：表计类型
                { wch: 15 },  // B列：表号
                { wch: 20 },  // C列：安装位置
                { wch: 15 },  // D列：表计编码
                { wch: 15 },  // E列：信驰表号
                { wch: 12 },  // F列：规格
                { wch: 20 },  // G列：表计名称
                { wch: 15 },  // H列：制造商
                { wch: 15 },  // I列：上级表号
                { wch: 15 },  // J列：区域
                { wch: 12 },  // K列：楼栋
                { wch: 15 },  // L列：用途
                { wch: 15 },  // M列：供应点位
                { wch: 8 },   // N列：倍率
                { wch: 10 },  // O列：启表底数
                { wch: 12 },  // P列：折标煤系数
                { wch: 12 },  // Q列：参与漏水统计
                { wch: 12 },  // R列：纳入离线统计
                { wch: 10 },  // S列：重点设备
                { wch: 15 },  // T列：设备名称
                { wch: 10 },  // U列：信号强度
                { wch: 12 },  // V列：安装日期
                { wch: 30 }   // W列：备注
            ];

            ws['!cols'] = colWidths;

            // 将工作表添加到工作簿
            XLSX.utils.book_append_sheet(wb, ws, '表计导入模板');

            // 生成Excel文件并下载
            XLSX.writeFile(wb, `${filename}.xlsx`);

            ElMessage.success(`成功导出 ${data.length} 条表计信息（导入格式）`);
        } catch (error) {
            console.error('导出失败:', error);
            ElMessage.error('导出失败，请重试');
        }
    };

    // 生成详细信息Excel
    const generateDetailedExcel = (data, filename) => {
        try {
            // 创建工作簿
            const wb = XLSX.utils.book_new();

            // 将数据转换为工作表
            const ws = XLSX.utils.json_to_sheet(data);

            // 设置列宽
            const colWidths = [
                { wch: 6 },   // 序号
                { wch: 20 },  // 表计名称
                { wch: 20 },  // 表计编码
                { wch: 15 },  // 表计ID
                { wch: 10 },  // 表计类型
                { wch: 15 },  // 引擎
                { wch: 8 },   // 状态
                { wch: 12 },  // 规格
                { wch: 15 },  // 制造商
                { wch: 12 },  // 能源类别
                { wch: 12 },  // 折标煤系数
                { wch: 8 },   // 倍率
                { wch: 10 },  // 启表底数
                { wch: 20 },  // 父级表计
                { wch: 20 },  // 安装位置
                { wch: 12 },  // 安装日期
                { wch: 15 },  // 供应点位
                { wch: 12 },  // 区域
                { wch: 10 },  // 楼栋
                { wch: 12 },  // 用途
                { wch: 12 },  // 参与漏水统计
                { wch: 12 },  // 纳入离线统计
                { wch: 10 },  // 电表类型
                { wch: 12 },  // 新能源类型
                { wch: 10 },  // 重点设备
                { wch: 15 },  // 设备名称
                { wch: 10 },  // 信号强度
                { wch: 30 }   // 备注
            ];

            ws['!cols'] = colWidths;

            // 将工作表添加到工作簿
            XLSX.utils.book_append_sheet(wb, ws, '表计详细信息');

            // 生成Excel文件并下载
            XLSX.writeFile(wb, `${filename}.xlsx`);

            ElMessage.success(`成功导出 ${data.length} 条表计详细信息`);
        } catch (error) {
            console.error('导出失败:', error);
            ElMessage.error('导出失败，请重试');
        }
    };

    // 根据elec_generate值获取对应的标签类型和文本
    const getElecGenerateTypeName = (value) => {
        switch (Number(value)) {
            case 1: return '发电';
            case 2: return '售电';
            case 3: return '供电';
            default: return '未知';
        }
    };

    return {
        exportSelectedMeters,      // 导出选中表计（导入格式）
        exportAllMeters,          // 导出所有表计（导入格式）
        exportDetailedMeters      // 导出详细信息（原格式）
    };
}